﻿#define  _CRT_SECURE_NO_WARNINGS
//位1的个数
//编写一个函数，输入是一个无符号整数（以二进制串的形式），
//返回其二进制表达式中数字位数为 '1' 的个数（也被称为汉明重量）。
//最简单解法：
int hammingWeight(uint32_t n) {
    int count = 0;
    while (n) {
        count += n % 2;
        n /= 2;

    }
    return count;
}
//进阶解法：
int hammingWeight(uint32_t n) {
    int count = 0;
    int i = 0;
    for (i = 0;i < 32;i++) {
        if (((n >> i) & 1))
            count++;
    }
    return count;
}
//最优解法：
int hammingWeight(uint32_t n) {
    int count = 0;
    while (n) {
        n = n & (n - 1);
        count++;

    }
    return count;
}
//存在重复的元素
//给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ，返回 true ；如果数组中每个元素互不相同，返回 false 。
int cmp(const void* p1, const void* p2) {
    return *((int*)p1) - *((int*)p2);
}
bool containsDuplicate(int* nums, int numsSize) {
    qsort(nums, numsSize, sizeof(nums[0]), cmp);
    int i = 0;

    for (i = 0;i < numsSize - 1;i++) {
        if (nums[i] == nums[i + 1])
            return true;
    }
    return false;

}
//移除元素：
//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//
//不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
//
//元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/remove-element
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
int removeElement(int* nums, int numsSize, int val) {
    int i = 0;
    int j = 0;
    while (i < numsSize) {
        if (nums[i] != val) {
            nums[j] = nums[i];
            j++;
        }
        i++;
    }
    return j;

}
//2的幂：
//给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
//
//如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。
//
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/power-of-two
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
//简单版本：
bool isPowerOfTwo(int n) {
    if (n <= 0)
        return false;
    if (n == 1)
        return true;
    if (n % 2 == 0)
        return isPowerOfTwo(n / 2);
    return false;

}
//进阶版本：
bool isPowerOfTwo(int n) {
    if (n > 0 && ((n & (n - 1)) == 0))//括号
        return true;
    return false;

}
//合并两个有序数组：
//给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
//
//请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
//
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/merge-sorted-array
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

int cmp(const void* p1, const void* p2) {
    return *((int*)p1) - *((int*)p2);
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int j = 0;
    int i = 0;
    for (i = m;i < m + n;i++) {
        nums1[i] = nums2[j];
        j++;
    }
    qsort(nums1, m + n, sizeof(int), cmp);
    return nums1;

}

